home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
PROGRAM
/
CUJ9202.ARJ
/
1002038A
< prev
next >
Wrap
Text File
|
1992-06-02
|
2KB
|
91 lines
/* Listing 3 */
/*begin************************************************
* Program : closest
* Descript. : Returns the number of the closest color
* from the palette, given the desired red
* green, and blue. Find the closest point
* by using the red index arrey. Look at
* points on both sides of the closest
* point. While searching, if a point is
* closer then it is the shortest distance
* Once you are examining points that are
* farther away in just the one dimension
* (red) then you are done.
*end**************************************************/
int closest( int red, int green, int blue )
{
long least;
long dif;
long sum;
int index;
int left;
int right;
index = redindex[ red ];
least = dist( red, green, blue, index );
left = index;
right = index;
while( ( left >= 0 ) || ( right < PAL_LEN ) )
{
if ( --left >= 0 )
{
/* if red dist. alone is greater, then quit */
dif = red - pals[ left ].red;
if ( ( dif * dif ) > least )
left = -1;
else
{
sum = dist( red, green, blue, left );
if ( sum < least )
{
least = sum;
index = left;
}
}
}
if ( ++right < PAL_LEN )
{
/* if red dist. alone is greater, then quit */
dif = red - pals[ right ].red;
if ( ( dif * dif ) > least )
right = PAL_LEN;
else
{
sum = dist( red, green, blue, right );
if ( sum < least )
{
least = sum;
index = right;
}
}
}
}
return( pals[ index ].num );
}
/*begin************************************************
* Program : dist
* Descript. : Color distance (squared)
*end**************************************************/
long dist( int red, int green, int blue, int num )
{
long dif;
long sum;
pal *palt;
palt = &pals[ num ];
dif = red - palt->red;
sum = dif * dif;
dif = green - palt->grn;
sum += dif * dif;
dif = blue - palt->blu;
sum += dif * dif;
return( sum );
}